/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function (nums) {
  let len = nums.length
  const arr = [nums[0]]
  for (let i = 1; i < nums.length; i++) {
      arr[i] = nums[i] * arr[i - 1]
  }
  let reverseN = 1
  for (let j = len - 1; j > 0; j--) {
      arr[j] = arr[j - 1] * reverseN
      reverseN = reverseN * nums[j]
  }
  arr[0] = reverseN
  return arr
};
// 更好一点的答案，arr下标代表不乘自己的值，默认第一个为1
// 一轮下来后最后一个元素的答案已经得出
// 第二轮从后往前，由于最后一个元素已经有答案，所以从len - 2开始
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var productExceptSelf = function(nums) {
  const length = nums.length
    let arr = [1], reverseNum = 1
    for(let i = 1; i < length; i++) {
        arr[i] = arr[i - 1] * nums[i - 1]
    }
    for(let i = length - 2; i >= 0; i--) {
        reverseNum = reverseNum * nums[i + 1]
        arr[i] = arr[i] * reverseNum
    }
    return arr
};